package EP.MetricasContenido;

import SBD.CRUD.ScoreBD;
import EP.Web.Pagina;
import EP.Web.RelacionPaginas;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* @class Score
* @author Mauricio Alvarez.
* @brief Esta clase representa la clase Score, correspondiente a una entidad principal (EP).
 * Estructura todos los puntajes de ranking utilizados para las métricas de distancia.
*/
public class Score
{

    /**
     *  @var private TF tf
     *  @brief Variable global de tipo clase TF.
    */
    private TF tf;
    /**
     *  @var private IDF idf
     *  @brief Variable global de tipo clase IDF.
    */
    private IDF idf;
    /**
     *  @var private TfxIDF tfxidf
     *  @brief Variable global de tipo clase TfxIDF.
    */
    private TfxIDF tfxidf;
    /**
     *  @var private OkapiBM25 okapi
     *  @brief Variable global de tipo clase OkapiBM25.
    */
    private OkapiBM25 okapi;
    /**
     *  @var private ScoreBD scorebd
     *  @brief Variable global de tipo clase ScoreBD.
    */
    private ScoreBD scorebd;


    ////////////////////
    // CONSTRUCTOR
    ////////////////////
    public Score()
    {
        tf = new TF();
        idf = new IDF();
        tfxidf = new TfxIDF();
        okapi = new OkapiBM25();
        scorebd = new ScoreBD();
    }


    //////////////////////////
    // OPERACIONES
    //////////////////////////

    /**
     * @brief Invoca a las funciones de cálculo de las distintas métricas y las guarda en una estructura común.
     * @param Topico, Stopwords, ListaPaginas, ListaRelacionPaginas, TopicoConsultado, OpcionContenido, Umbral, Ranking, factorK1 y factorb
     * @return Map<Integer, List>
    */
    public Map<Integer, List> CalcularScore(Map<String, Integer> Topico,
                                            Map<String, Integer> Stopwords,
                                            List<Pagina> ListaPaginas,
                                            List<RelacionPaginas> ListaRelacionPaginas,
                                            String TopicoConsultado,
                                            int OpcionContenido,
                                            double Umbral,
                                            int Ranking,
                                            double factorK1,
                                            double factorb) throws FileNotFoundException, IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException, Error, Exception
    {
        
        //Guarda los resultados de las variantes TF para las páginas.
        //BODY: La key corresponde al id_pagina.
        //SURROUND TEXT: La key corresponde a id_relacion_pag.
        Map<Integer,List> ResultadosTF = new HashMap();
         
        //Guarda los resultados IDF para las páginas.
        //BODY: La key corresponde al termino.
        //SURROUND TEXT: La key corresponde al termino.
        Map<String, List> ResultadosIDF = new HashMap();

        //Guarda los resultados del Tf x IDF para las páginas.
        //BODY: La key corresponde al termino.
        //SURROUND TEXT: La key corresponde al termino.
        Map<Integer, List> ResultadosTfxIDF = new HashMap();

        //Guarda los resultados de todas las variantes score para las páginas, incluido BM25.
        //BODY: La key corresponde al termino.
        //SURROUND TEXT: La key corresponde al termino.
        Map<Integer,List> ResultadosScore = new HashMap();

        ////////////////////////////////////////////////////////////////////////
        //PASO 1: Se calculan las variantes TF para todas las páginas
        //        o sus relaciones entre ellas (OK).
        ////////////////////////////////////////////////////////////////////////
        ResultadosTF = tf.CalcularTF(Topico, Stopwords, ListaPaginas, ListaRelacionPaginas, TopicoConsultado, OpcionContenido, Umbral, Ranking);

        /////////////////////////////////////////////////////////////////////////
        //PASO 2: Se calcula el IDF para el lote de documentos para cada termino
        //        o sus relaciones entre ellas (OK).
        /////////////////////////////////////////////////////////////////////////
        ResultadosIDF = idf.CalcularIDF(Topico, Stopwords, ListaPaginas, ListaRelacionPaginas, TopicoConsultado,  OpcionContenido, Umbral, Ranking);

        ////////////////////////////////////////////////////////////////////////
        //PASO 3: Se calcula el Tf x IDF para el lote de documentos para cada
        //        termino (OK).
        ////////////////////////////////////////////////////////////////////////
        ResultadosTfxIDF = tfxidf.CalcularTfxIDF(ResultadosTF, ResultadosIDF, OpcionContenido);

        ////////////////////////////////////////////////////////////////////////
        //PASO 4: Se calcula el ranking Okapi BM25 para el lote de documentos
        //        para cada termino (OK).
        ////////////////////////////////////////////////////////////////////////
        ResultadosScore = okapi.CalcularOkapi(ResultadosTfxIDF, ResultadosTF, factorb, factorK1, OpcionContenido);

        ////////////////////////////////////////////////////
        //PASO 5: Se guardan en la BD los resultados (OK)
        ////////////////////////////////////////////////////
        scorebd.GuardarScore(ResultadosScore, TopicoConsultado, Umbral, Ranking, factorK1, factorb, OpcionContenido);

        //////////////////////////////////////////////
        //PASO 6: Se rankean los resultados (OK)
        //////////////////////////////////////////////
        scorebd.RankingScores(ListaPaginas, ListaRelacionPaginas, TopicoConsultado,Ranking, Umbral, OpcionContenido);

        /////////////////////////////////////////////////////////////////
        //PASO 7: Se retornan los resultados al clasificador (OK)
        /////////////////////////////////////////////////////////////////
        return ResultadosScore;


    }//FIN CalcularScore


    /**
     * @brief Obtiene el identificador de la mejor página para TF_SN.
     * @param int Ranking
     * @return int
    */
    public int ObtenerMejorPaginaTF_SN(int Ranking) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, SQLException
    {
        return scorebd.ObtenerMejorPaginaTF_SN(Ranking);
    }


    /**
     * @brief Obtiene el identificador de la mejor página para TF_N.
     * @param int Ranking
     * @return int
    */
    public int ObtenerMejorPaginaTF_N(int Ranking) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, SQLException
    {
        return scorebd.ObtenerMejorPaginaTF_N(Ranking);
    }


    /**
     * @brief Obtiene el identificador de la mejor página para TF_S.
     * @param int Ranking
     * @return int
    */
    public int ObtenerMejorPaginaTF_S(int Ranking) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, SQLException
    {
        return scorebd.ObtenerMejorPaginaTF_S(Ranking);
    }


    /**
     * @brief Obtiene el identificador de la mejor página para TFIDF_SN.
     * @param int Ranking
     * @return int
    */
    public int ObtenerMejorPaginaTFIDF_SN(int Ranking) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, SQLException
    {
        return scorebd.ObtenerMejorPaginaTFIDF_SN(Ranking);
    }


    /**
     * @brief Obtiene el identificador de la mejor página para TFIDF_N.
     * @param int Ranking
     * @return int
    */
    public int ObtenerMejorPaginaTFIDF_N(int Ranking) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, SQLException
    {
        return scorebd.ObtenerMejorPaginaTFIDF_N(Ranking);
    }


    /**
     * @brief Obtiene el identificador de la mejor página para TFIDF_S.
     * @param int Ranking
     * @return int
    */
    public int ObtenerMejorPaginaTFIDF_S(int Ranking) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, SQLException
    {
        return scorebd.ObtenerMejorPaginaTFIDF_S(Ranking);
    }


    /**
     * @brief Obtiene el identificador de la mejor página para TFIDF_O_SN.
     * @param int Ranking
     * @return int
    */
    public int ObtenerMejorPaginaTFIDF_O_SN(int Ranking) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, SQLException
    {
        return scorebd.ObtenerMejorPaginaTFIDF_O_SN(Ranking);
    }


    /**
     * @brief Obtiene el identificador de la mejor página para TFIDF_O_N.
     * @param int Ranking
     * @return int
    */
    public int ObtenerMejorPaginaTFIDF_O_N(int Ranking) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, SQLException
    {
        return scorebd.ObtenerMejorPaginaTFIDF_O_N(Ranking);
    }


    /**
     * @brief Obtiene el identificador de la mejor página para TFIDF_O_N.
     * @param int Ranking
     * @return int
    */
    public int ObtenerMejorPaginaTFIDF_O_S(int Ranking) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, SQLException
    {
        return scorebd.ObtenerMejorPaginaTFIDF_O_S(Ranking);
    }


    /**
     * @brief Obtiene el identificador de la mejor página para OKAPI.
     * @param int Ranking
     * @return int
    */
    public int ObtenerMejorPaginaOKAPI(int Ranking) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, SQLException
    {
        return scorebd.ObtenerMejorPaginaOKAPI(Ranking);
    }


    /**
     * @brief Obtiene el identificador del mejor texto alrededor para TF_SN.
     * @param int Ranking
     * @return int
    */
    public int ObtenerMejorST_TF_SN(int Ranking) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, SQLException
    {
        return scorebd.ObtenerMejorST_TF_SN(Ranking);
    }


    /**
     * @brief Obtiene el identificador del mejor texto alrededor para TF_N.
     * @param int Ranking
     * @return int
    */
    public int ObtenerMejorST_TF_N(int Ranking) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, SQLException
    {
        return scorebd.ObtenerMejorST_TF_N(Ranking);
    }


    /**
     * @brief Obtiene el identificador del mejor texto alrededor para TF_S.
     * @param int Ranking
     * @return int
    */
    public int ObtenerMejorST_TF_S(int Ranking) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, SQLException
    {
        return scorebd.ObtenerMejorST_TF_S(Ranking);
    }


    /**
     * @brief Obtiene el identificador del mejor texto alrededor para TFIDF_SN.
     * @param int Ranking
     * @return int
    */
    public int ObtenerMejorST_TFIDF_SN(int Ranking) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, SQLException
    {
        return scorebd.ObtenerMejorST_TFIDF_SN(Ranking);
    }


    /**
     * @brief Obtiene el identificador del mejor texto alrededor para TFIDF_N.
     * @param int Ranking
     * @return int
    */
    public int ObtenerMejorST_TFIDF_N(int Ranking) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, SQLException
    {
        return scorebd.ObtenerMejorST_TFIDF_N(Ranking);
    }


    /**
     * @brief Obtiene el identificador del mejor texto alrededor para TFIDF_S.
     * @param int Ranking
     * @return int
    */
    public int ObtenerMejorST_TFIDF_S(int Ranking) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, SQLException
    {
        return scorebd.ObtenerMejorST_TFIDF_S(Ranking);
    }


    /**
     * @brief Obtiene el identificador del mejor texto alrededor para TFIDF_O_SN.
     * @param int Ranking
     * @return int
    */
    public int ObtenerMejorST_TFIDF_O_SN(int Ranking) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, SQLException
    {
        return scorebd.ObtenerMejorST_TFIDF_O_SN(Ranking);
    }


    /**
     * @brief Obtiene el identificador del mejor texto alrededor para TFIDF_O_N.
     * @param int Ranking
     * @return int
    */
    public int ObtenerMejorST_TFIDF_O_N(int Ranking) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, SQLException
    {
        return scorebd.ObtenerMejorST_TFIDF_O_N(Ranking);
    }


    /**
     * @brief Obtiene el identificador del mejor texto alrededor para TFIDF_O_S.
     * @param int Ranking
     * @return int
    */
    public int ObtenerMejorST_TFIDF_O_S(int Ranking) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, SQLException
    {
        return scorebd.ObtenerMejorST_TFIDF_O_S(Ranking);
    }


    /**
     * @brief Obtiene el identificador del mejor texto alrededor para OKAPI.
     * @param int Ranking
     * @return int
    */
    public int ObtenerMejorST_OKAPI(int Ranking) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException, SQLException
    {
        return scorebd.ObtenerMejorST_OKAPI(Ranking);
    }


}//FIN CLASE Score
